home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 050 / madtrb1.arc / FILE.INC < prev    next >
Text File  |  1986-03-13  |  33KB  |  725 lines

  1. { FILE.INC }
  2.  
  3. { *************************************************************************** }
  4. { *                                                                         * }
  5. { *                TURBO SCREEN INPUT PRE-PROCESSOR TOOLKIT                 * }
  6. { *                                                                         * }
  7. { *                  FILE CONTROL SUBPROGRAM INCLUDE FILE                   * }
  8. { *                                                                         * }
  9. { *                             Version  1.07                               * }
  10. { *                                                                         * }
  11. { *                                                                         * }
  12. { *    This subprogram contains five modules.  Two modules are used simply  * }
  13. { *    to prompt the user with a file request window.  Two other modules    * }
  14. { *    use the previous modules when prompting the user when reading and    * }
  15. { *    writing data input files.  The last module generates a directory     * }
  16. { *    listing of data input files.  Note that there are some global        * }
  17. { *    functions and procedures contained within this library which are     * }
  18. { *    shared by these modules.                                             * }
  19. { *                                                                         * }
  20. { *    Note that the modules within this include file have been written     * }
  21. { *    specifically for the example application of the input pre-processor. * }
  22. { *    You may want to rewrite these modules for your application.          * }
  23. { *                                                                         * }
  24. { *************************************************************************** }
  25.  
  26.  
  27.  
  28. Procedure RemoveNewFileLabel;
  29.  
  30. { This procedure removes the NEW FILE label for the input data file name that
  31.   the user has entered. }
  32.  
  33. Begin   { RemoveNewFileLabel }
  34.   TextBackground(BackgroundColor);
  35.   Window(1,1,80,25);
  36.   GotoXY(60,3);
  37.   Write('        ');
  38.   NewFile:=False;
  39. End;    { RemoveNewFileLabel }
  40.  
  41.  
  42.  
  43. Procedure LabelNewFile;
  44.  
  45. { This procedure describes the input data filename that the user has inputed as
  46.   a NEW FILE. }
  47.  
  48. Begin   { LabelNewFile }
  49.   TextColor(ForegroundColor);
  50.   TextBackground(BackgroundColor);
  51.   Window(1,1,80,25);
  52.   GotoXY(60,3);
  53.   Write('NEW FILE');
  54.   NewFile:=True;
  55. End;    { LabelNewFile }
  56.  
  57.  
  58.  
  59. Procedure RemoveWindow;
  60.  
  61. { This procedure removes the file message window which was overlayed onto the
  62.   current input page. }
  63.  
  64. Begin   { RemoveWindow }
  65.   Window(1,1,80,25);
  66.   RecallTextScreen(1);
  67. End;    { RemoveWindow }
  68.  
  69.  
  70.  
  71. Procedure ShowFileWindowModule;
  72.  
  73. { *************************************************************************** }
  74. { *                                                                         * }
  75. { *                    SHOW FILE MESSAGE WINDOW MODULE                      * }
  76. { *                                                                         * }
  77. { *    This module controls the overlaying of a input data file window      * }
  78. { *    onto the current screen.  This window is used to prompt the user     * }
  79. { *    what to do with input data files.                                    * }
  80. { *                                                                         * }
  81. { *************************************************************************** }
  82.  
  83. Var
  84.   TextString:WorkString;               { a string used in passing text to other procedures }
  85.  
  86.  
  87.  
  88.   Procedure ShowInputPrompt(    InputPrompt,
  89.                                 PromptColor,
  90.                                 PromptBackground,
  91.                                 InputBlockColor,
  92.                                 InputBlockBackground:Integer);
  93.  
  94.   { This procedure is used to display the file name and disk drive specifier
  95.     prompt onto the file control window. }
  96.  
  97.   Var
  98.     ScreenCol:Integer;                 { column index counter used in displaying empty input data entry }
  99.  
  100.   Begin   { ShowInputPrompt }
  101.     With G_I_Pages[1].Template[InputPrompt]^ Do    { observe the 1 as the G_I_Page, specific to example application }
  102.       Begin
  103.         TextColor(PromptColor);
  104.         TextBackground(PromptBackground);
  105.         GotoXY(InputCol,InputRow);
  106.         For ScreenCol:=1 To InputLength Do
  107.           Write(' ');
  108.         GotoXY(PromptCol,PromptRow);
  109.         Write(Prompt);
  110.         TextColor(InputBlockColor);
  111.         TextBackground(InputBlockBackground);
  112.         GotoXY(InputCol,InputRow);
  113.         If Length(G_I_Data[InputPrompt,1]^)=0 Then { observe the 1 as the G_I_Page, specific to example application }
  114.           For ScreenCol:=1 To InputLength Do
  115.             Write(' ')
  116.         Else
  117.           Write(G_I_Data[InputPrompt,1]^);         { observe the 1 as the G_I_Page, specific to example application }
  118.       End; { With G_I_Pages }
  119.   End;    { ShowInputPrompt }
  120.  
  121.  
  122.  
  123. Begin   { ShowFileWindowModule }
  124.   StoreTextScreen(1);                  { take a snapshot of the screen }
  125.   TextColor(InputWindowBorderColor);
  126.   TextBackground(InputWindowColor);
  127.   ZoomWindow2(4,2,77,10);
  128.   TextColor(ForegroundColor);
  129.   TextString:='Make selection with  '+Chr(27)+'   '+Chr(26)+'  and then press <Enter>';
  130.   WriteCenterText(10,TextString);
  131.   { write out input data file name }
  132.   ShowInputPrompt(1,
  133.                   ForegroundColor,
  134.                   InputWindowColor,
  135.                   ForegroundColor,
  136.                   InputWindowColor);
  137.   { write out disk drive specifier path }
  138.   ShowInputPrompt(2,
  139.                   ForegroundColor,
  140.                   InputWindowColor,
  141.                   ForegroundColor,
  142.                   InputWindowColor);
  143. End;    { ShowFileWindowModule }
  144.  
  145.  
  146.  
  147. Function ExistantFile:Boolean;
  148.  
  149. { This function determines if the input data file the user has named exists
  150.   under the specified disk directory path.  If the file exists, this function
  151.   returns to the calling routine as true. }
  152.  
  153. Var
  154.   InputDataFile:Text;                  { input data file is a ASCII text file }
  155.  
  156. Begin   { ExistantFile }
  157.   { following routine is specific to the example application of the input pre-processor }
  158.   If G_I_Data[2,1]^='' Then            { user has not specified a directory path }
  159.     Assign(InputDataFile,G_I_Data[1,1]^+INPUT_FILE_NAME_EXTENSION) { assign disk file }
  160.   Else                                 { user has specified a directory path }
  161.     Assign(InputDataFile,G_I_Data[2,1]^+'\'+G_I_Data[1,1]^+INPUT_FILE_NAME_EXTENSION); { assign disk file }
  162.   {$I-}                                { I/O error checking is set to passive state }
  163.   Reset(InputDataFile);                { open file for reading }
  164.   {$I+}                                { I/O error checking is set to active state }
  165.   If IOresult=0 Then                   { If IOresult=0, then file exists }
  166.     Begin                              { input data file exists }
  167.       Close(InputDataFile);            { make certain to close file after checking if file exists }
  168.       ExistantFile:=True;              { function returns as true }
  169.     End { If IOresult }
  170.   Else                                 { input data file does not exist }
  171.     ExistantFile:=False;               { function returns as false }
  172. End;    { ExistantFile }
  173.  
  174.  
  175.  
  176. Procedure PromptUserModule(Var ToggleSwitchOn:Boolean);
  177.  
  178. { *************************************************************************** }
  179. { *                                                                         * }
  180. { *                          PROMPT USER MODULE                             * }
  181. { *                                                                         * }
  182. { *       This module prompts the user for a command by controlling a       * }
  183. { *       visible toggle switch.  The user selects either 'YES' or 'NO'     * }
  184. { *       and then presses return to communicate his instruction.           * }
  185. { *       This module then returns to the calling routine what the user's   * }
  186. { *       selection was.                                                    * }
  187. { *                                                                         * }
  188. { *************************************************************************** }
  189.  
  190. Var
  191.   CharEntry:Char;                      { a variable used in reading the keyboard }
  192.  
  193.  
  194.  
  195.   Procedure ShowToggleSwitch(    ToggleSwitchOn:Boolean);
  196.  
  197.   { This procedure locates and prints on the screen whether the toggle switch
  198.     has been set to 'YES' or 'NO'. }
  199.  
  200.   Begin   { ShowToggleSwitch }
  201.     GotoXY(37,8);
  202.     If ToggleSwitchOn Then             { toggle switch set to 'YES' }
  203.       Begin
  204.         TextColor(HighlightColor);
  205.         Write('YES ');
  206.         TextColor(ForegroundColor);
  207.         Write('/ NO');
  208.       End { If ToggleSwitchOn }
  209.     Else                               { toggle switch set to 'NO' }
  210.       Begin
  211.         TextColor(ForegroundColor);
  212.         Write('YES /');
  213.         TextColor(HighlightColor);
  214.         Write(' NO');
  215.       End; { Else }
  216.   End;    { ShowToggleSwitch }
  217.  
  218.  
  219.  
  220.   Procedure CurseLeft(Var ToggleSwitchOn:Boolean);
  221.  
  222.   { This procedure controls the cursor's leftward movement.  Note that cursing
  223.     to the left or typing 'Y' or 'y' turns on the toggle switch.  Also note
  224.     that if the switch is already on then an error is sounded. }
  225.  
  226.   Begin   { CurseLeft }
  227.     If Not(ToggleSwitchOn) Then
  228.       Begin
  229.         ToggleSwitchOn:=True;
  230.         ShowToggleSwitch(ToggleSwitchOn);
  231.       End { If Not(ToggleSwitchOn) }
  232.     Else { illegal entry }
  233.       SoundError;
  234.   End;    { CurseLeft }
  235.  
  236.  
  237.  
  238.   Procedure CurseRight(Var ToggleSwitchOn:Boolean);
  239.  
  240.   { This procedure controls the cursor's rightward movement.  Note that cursing
  241.     to the right or typing 'N' or 'n' turns off the toggle switch.  Also note
  242.     that if the switch is already off then an error is sounded. }
  243.  
  244.   Begin   { CurseRight }
  245.     If ToggleSwitchOn Then
  246.       Begin
  247.         ToggleSwitchOn:=False;
  248.         ShowToggleSwitch(ToggleSwitchOn);
  249.       End { If ToggleSwitchOn }
  250.     Else { illegal entry }
  251.       SoundError;
  252.   End;    { CurseRight }
  253.  
  254.  
  255.  
  256. Begin   { PromptUserModule }
  257.   ToggleSwitchOn:=False;               { initialize toggle switch to off }
  258.   ShowToggleSwitch(ToggleSwitchOn);    { display toggle switch }
  259.   Repeat
  260.     Read(Kbd,CharEntry);
  261.     If(CharEntry=Chr(27)) And Keypressed Then { read a character, check for a double character entry. }
  262.       Begin                            { double character entry }
  263.         Read(Kbd,CharEntry);
  264.         Case Ord(CharEntry) Of
  265.           75 : CurseLeft(ToggleSwitchOn);  { CurseLeft }
  266.           77 : CurseRight(ToggleSwitchOn); { CurseRight }
  267.         Else { illegal entry }
  268.           SoundError;
  269.         End; { Case }
  270.       End { If CharEntry }
  271.     Else                               { single character entry }
  272.       If CharEntry<>Chr(13) Then
  273.         Case CharEntry Of
  274.           'Y' : CurseLeft(ToggleSwitchOn);  { Character Y }
  275.           'y' : CurseLeft(ToggleSwitchOn);  { Character y }
  276.           'N' : CurseRight(ToggleSwitchOn); { Character N }
  277.           'n' : CurseRight(ToggleSwitchOn); { Character n }
  278.         Else { illegal entry }
  279.           SoundError;
  280.         End; { Case CharEntry }
  281.   Until CharEntry=Chr(13);             { until received carriage return }
  282. End;    { PromptUserModule }
  283.  
  284.  
  285.  
  286. Procedure ReadInputFileModule;
  287.  
  288. { *************************************************************************** }
  289. { *                                                                         * }
  290. { *                       READ INPUT DATA FILE MODULE                       * }
  291. { *                                                                         * }
  292. { *      This module controls all of the input data file handling           * }
  293. { *      routines for retrieving data off of disk storage.  In addition,    * }
  294. { *      it prompts the user for input file handling commands.              * }
  295. { *                                                                         * }
  296. { *************************************************************************** }
  297.  
  298. Var
  299.   ReadInputFile:Boolean;               { a boolean used to determine if the user wants the input data file to be read }
  300.  
  301.  
  302.  
  303.   Procedure ReadInputDataFile;
  304.  
  305.   { This procedure reads the entries out of the user's declared input data
  306.     work file and stores the entries into both the G_I_Data and S_I_Data
  307.     data pointer arrays. }
  308.  
  309.   Var
  310.     InputDataFile:Text;                { input data file is a ASCII text file }
  311.     Page:Integer;                      { a index counter to a data page }
  312.     Row:Integer;                       { a index counter to a data row }
  313.     Col:Integer;                       { a index counter to a data column }
  314.  
  315.   Begin   { ReadInputDataFile }
  316.     { following routine is specific to the example application of the input pre-processor }
  317.     If G_I_Data[2,1]^='' Then          { user has not specified a directory path }
  318.       Assign(InputDataFile,G_I_Data[1,1]^+INPUT_FILE_NAME_EXTENSION) { assign disk file }
  319.     Else                               { user has specified a directory path }
  320.       Assign(InputDataFile,G_I_Data[2,1]^+'\'+G_I_Data[1,1]^+INPUT_FILE_NAME_EXTENSION);
  321.     Reset(InputDataFile);              { open input data file for reading }
  322.     {$I-}                              { I/O error checking is set to passive state }
  323.     For Page:=1 To MAX_NUM_OF_G_I_PAGES Do           { # of general input pages }
  324.       For Row:=1 To G_I_RECORD_LIMIT Do              { # of general input rows }
  325.         If G_I_Data[Row,Page]<>Nil Then              { check for corresponding prompt entry in template }
  326.           If Not ((Page=1) And (Row<=2)) Then        { specific to example application of the input pre-processor }
  327.             ReadLn(InputDataFile,G_I_Data[Row,Page]^); { read entry out of file }
  328.     For Page:=1 To MAX_NUM_OF_S_I_PAGES Do           { # of scrolling input pages }
  329.       For Row:=1 To S_I_ENTRY_LIMIT Do               { # of scrolling input rows }
  330.         For Col:=1 To MAX_NUM_OF_S_I_DATA_COLS Do    { # of scrolling input columns }
  331.           ReadLn(InputDataFile,S_I_Data[Col,Row,Page]^); { read scrolling input entry out of file }
  332.     Close(InputDataFile);              { close input data file }
  333.     {$I+}                              { I/O error checking is set to active state }
  334.   End;    { ReadInputDataFile }
  335.  
  336.  
  337.  
  338.   Procedure ShowReadFileWindow(    ReadInputFile:Boolean);
  339.  
  340.   { This procedure prompts the user for file reading handling information. }
  341.  
  342.   Begin   { ShowReadFileWindow }
  343.     If Not(ReadInputFile) Then         { show first file handling prompt }
  344.       Begin
  345.         ShowFileWindowModule;
  346.         GotoXY(15,6);
  347.         TextColor(HighlightColor);
  348.         Write('Do you wish the above disk file to be read into memory?');
  349.       End { If Not(ReadInputFile) }
  350.     Else                               { show second file handling prompt }
  351.       Begin
  352.         TextColor(HighlightColor);
  353.         GotoXY(15,6);
  354.         Write('                                                         ');
  355.         GotoXY(37,8);
  356.         Write('        ');
  357.         GotoXY(30,6);
  358.         Write('Input file being read');
  359.       End; { Else }
  360.   End;    { ShowReadFileWindow }
  361.  
  362.  
  363.  
  364. Begin   { ReadInputFileModule }
  365.   { following routine is specific to example application of the input pre-processor }
  366.   If G_I_Data[1,1]^<>'' Then           { check for a user entered filename }
  367.     If ExistantFile Then
  368.       Begin                            { input file is existant }
  369.         SoundAttention;
  370.         ShowReadFileWindow(ReadInputFile);
  371.         PromptUserModule(ReadInputFile);
  372.         If ReadInputFile Then
  373.           Begin                        { read file }
  374.             SoundAttention;
  375.             ShowReadFileWindow(ReadInputFile);
  376.             ReadInputDataFile;
  377.             RemoveWindow;
  378.             Write_G_I_Entries;
  379.             RemoveNewFileLabel;        { do not declare file name as a new file }
  380.           End { If ReadInputFile }
  381.         Else { Not ReadInputFile }
  382.           Begin
  383.             RemoveWindow;
  384.             LabelNewFile               { declare file name as a new file }
  385.           End; { Else }
  386.       End { If ExistantFile }
  387.     Else                               { user declared input file is non-existant }
  388.       LabelNewFile
  389.   Else                                 { no user declared input file }
  390.     RemoveNewFileLabel;
  391. End;    { ReadInputFileModule }
  392.  
  393.  
  394.  
  395. Procedure WriteInputFileModule;{(Var ReturnToMainModule:Boolean);}
  396.  
  397. { *************************************************************************** }
  398. { *                                                                         * }
  399. { *                     WRITE INPUT DATA FILE MODULE                        * }
  400. { *                                                                         * }
  401. { *      This module controls all of the input data file handling           * }
  402. { *      routines for storing data on disk.  In addition, the module        * }
  403. { *      prompts the user for input file handling commands.                 * }
  404. { *                                                                         * }
  405. { *************************************************************************** }
  406.  
  407. Var
  408.   ToggleSwitchOn:Boolean;              { a boolean used to determine the user's selection }
  409.  
  410.  
  411.  
  412.   Procedure WriteInputDataFile;
  413.  
  414.   { This procedure takes the entries from both the G_I_Data and S_I_Data
  415.     data pointer arrays and writes them into the user's declared input data
  416.     work file. }
  417.  
  418.   Var
  419.     InputDataFile:Text;                { input data file is a ASCII text file }
  420.     Page:Integer;                      { a index counter to a data page }
  421.     Row:Integer;                       { a index counter to a data row }
  422.     Col:Integer;                       { a index counter to a data column }
  423.  
  424.   Begin   { WriteInputDataFile }
  425.     { following routine is specific to example application of the input pre-processor }
  426.     If G_I_Data[2,1]^='' Then          { user has not specified a directory path }
  427.       Assign(InputDataFile,G_I_Data[1,1]^+INPUT_FILE_NAME_EXTENSION) { assign disk file }
  428.     Else                               { user has specified a directory path }
  429.       Assign(InputDataFile,G_I_Data[2,1]^+'\'+G_I_Data[1,1]^+INPUT_FILE_NAME_EXTENSION);
  430.     Rewrite(InputDataFile);            { open input data file for writing }
  431.     For Page:=1 To MAX_NUM_OF_G_I_PAGES Do              { # of general input pages }
  432.       For Row:=1 To G_I_RECORD_LIMIT Do                 { # of general input rows }
  433.         If G_I_Data[Row,Page]<>Nil Then                 { check for corresponding prompt entry in template }
  434.           If Not ((Page=1) And (Row<=2)) Then           { specific to example application of the input pre-processor }
  435.             WriteLn(InputDataFile,G_I_Data[Row,Page]^); { write entry out to file }
  436.     For Page:=1 To MAX_NUM_OF_S_I_PAGES Do            { # of scrolling input pages }
  437.       For Row:=1 To S_I_ENTRY_LIMIT Do                { # of scrolling input rows }
  438.         For Col:=1 To MAX_NUM_OF_S_I_DATA_COLS Do     { # of scrolling input columns }
  439.           WriteLn(InputDataFile,S_I_Data[Col,Row,Page]^); { write entry out to file }
  440.     Close(InputDataFile);              { close input data file }
  441.   End;    { WriteInputDataFile }
  442.  
  443.  
  444.  
  445.   Procedure ShowWriteFileMessage;
  446.  
  447.   { This procedure communicates to the user that the disk file is being
  448.     overwritten by the new input data. }
  449.  
  450.   Begin   { ShowWriteFileMessage }
  451.     SoundAttention;
  452.     TextColor(HighlightColor);
  453.     GotoXY(24,6);
  454.     Write('Input data file being written');
  455.     WriteInputDataFile;
  456.     ReturnToMainModule:=True;          { exit back to main module }
  457.   End;    { ShowWriteFileMessage }
  458.  
  459.  
  460.  
  461.   Procedure PromptUserIfToWriteOverExistantFile;
  462.  
  463.   { This procedure prompts the user if he wants to write over the named
  464.     existant disk file with the new input data.
  465.  
  466.     If the user answers yes then this module writes out the file and returns
  467.     him to the first menu page.
  468.  
  469.     If the user answers no then this module prompts the user to see if he
  470.     wants to exit the pre-processor.  If the user answers yes then he is
  471.     returned to the first menu page.  If he answers no then the user is
  472.     returned to where he was left off. }
  473.  
  474.   Begin   { PromptUserIfToWriteOverExistantFile }
  475.     SoundAttention;
  476.     GotoXY(15,6);
  477.     Write('Do you wish that the existing disk file be overwritten?');
  478.     PromptUserModule(ToggleSwitchOn);
  479.     GotoXY(15,6);
  480.     Write('                                                       ');
  481.     GotoXY(37,8);
  482.     Write('        ');
  483.     If ToggleSwitchOn Then             { write over existing disk file }
  484.       ShowWriteFileMessage
  485.     Else                               { do not write over existing disk file }
  486.       Begin                            { check if user wants to exit the pre-processor without saving data }
  487.         SoundAttention;
  488.         GotoXY(11,6);
  489.         Write('Do you wish to exit input data processor without saving data?');
  490.         PromptUserModule(ToggleSwitchOn);
  491.         If ToggleSwitchOn Then
  492.           ReturnToMainModule:=True     { exit back to main module }
  493.         Else                           { return to where user left off }
  494.           RemoveWindow;
  495.       End; { Else }
  496.   End;    { PromptUserIfToWriteOverExistantFile }
  497.  
  498.  
  499.  
  500.   Procedure PromptUserIfToExitPreprocessor;
  501.  
  502.   { This procedure prompts the user to see if he wants to exit the input data
  503.     preprocessor without saving data since there is no user declared input
  504.     filename.
  505.  
  506.     If the user answers yes then he is returned to the first menu.  If he
  507.     answers no then the user is returned to where he was left off. }
  508.  
  509.   Var
  510.     TextString:WorkString;             { a string used in passing text to other procedures }
  511.  
  512.   Begin   { PromptUserIfToExitPreprocessor }
  513.     StoreTextScreen(1);                { take snapshot of the screen }
  514.     SoundAttention;
  515.     TextColor(InputWindowBorderColor);
  516.     TextBackground(InputWindowColor);
  517.     ZoomWindow2(4,4,77,10);
  518.     TextColor(ForegroundColor);
  519.     TextString:='Make selection with  '+Chr(27)+'   '+Chr(26)+'  and then press <Enter>';
  520.     WriteCenterText(10,TextString);
  521.     TextColor(HighlightColor);
  522.     GotoXY(11,6);
  523.     Write('Do you wish to exit input data processor without saving data?');
  524.     PromptUserModule(ToggleSwitchOn);
  525.     If ToggleSwitchOn Then
  526.       ReturnToMainModule:=True         { exit back to main module }
  527.     Else                               { return to where user left off }
  528.       RemoveWindow;
  529.   End;    { PromptUserIfToExitPreprocessor }
  530.  
  531.  
  532.  
  533. Begin   { WriteInputFileModule }
  534.   { following routine is specific to example application of the input pre-processor }
  535.   If G_I_Data[1,1]^<>'' Then
  536.     Begin                              { user has entered a input file name }
  537.       ShowFileWindowModule;
  538.       TextColor(HighlightColor);
  539.       If ExistantFile Then
  540.         PromptUserIfToWriteOverExistantFile { prompt user if he wants to save input data to file }
  541.       Else { user declared input file is non-existant, write input data file }
  542.         ShowWriteFileMessage;
  543.     End { If G_I_Data }
  544.   Else                                 { no input file name has yet been entered by user }
  545.     PromptUserIfToExitPreprocessor;
  546. End;  { WriteInputFileModule }
  547.  
  548.  
  549.  
  550. Procedure DirectoryModule;
  551.  
  552. { *************************************************************************** }
  553. { *                                                                         * }
  554. { *                            DIRECTORY MODULE                             * }
  555. { *                                                                         * }
  556. { *      This module controls the display of the disk directory window.     * }
  557. { *      This module will only list those files with the three character    * }
  558. { *      extension defined for the input data files allowed for this        * }
  559. { *      particular application of the pre-processor.  Note that the        * }
  560. { *      three character input data file extension is declared in the       * }
  561. { *      constant header in the file 'Main.Mod'.                            * }
  562. { *                                                                         * }
  563. { *      This method was selected since the user only needs to see those    * }
  564. { *      files that are input data files specific to the particular         * }
  565. { *      application of the pre-processor.                                  * }
  566. { *                                                                         * }
  567. { *      Note that an interesting project might be re-writing this module   * }
  568. { *      to show the subdirectories in one color and the input data files   * }
  569. { *      in a different color, just like the Turbo editor does.             * }
  570. { *                                                                         * }
  571. { *************************************************************************** }
  572.  
  573. Var
  574.   LoggedDirectory:WorkString;          { a string used to temporarily store the currently logged directory }
  575.   ExistantDirectory:Boolean;           { a boolean used in checking if specified directory is existant }
  576.  
  577.  
  578.  
  579.   Procedure ListDirectory;
  580.  
  581.   { This procedure lists out all the valid input data files with the declared
  582.     input data file extension constant in the directory window. }
  583.  
  584.   Type    { ListDirectory }
  585.     CharArray=Array [1..12] Of Char;   { array type of character used in looking for input data files }
  586.     WorkString=String[20];             { string type used for file names }
  587.     RecordOfRegisters=                 { a record type to store the integer values of the 8088 internal registers }
  588.       Record
  589.         AX, BX, CX, DX, BP, SI, DI, DS, ES, Flags : Integer;   { Registers }
  590.       End; { RecordOfRegisters }
  591.  
  592.   Var
  593.     Registers:RecordOfRegisters;       { record variable used to store the integer values of the 8088 internal registers }
  594.     DTA:Array [ 1..43 ] Of Byte;       { Data Transfer Area }
  595.     Mask:CharArray;                    { an array used to store the input file name mask }
  596.     FileName:WorkString;               { a variable used to store a filename found in the directory }
  597.     Error:Integer;                     { a variable used to store the returned error code }
  598.     I:Integer;                         { an index counter used in returning file names }
  599.     J:Integer;                         { an index counter used in placing spaces between the acquired file names }
  600.  
  601.   Begin
  602.     FillChar(DTA,SizeOf(DTA),0);       { initialize the DTA buffer }
  603.     FillChar(Mask,SizeOf(Mask),0);     { initialize the mask }
  604.     FillChar(FileName,SizeOf(FileName),0); { initialize the file name }
  605.     Registers.AX:=$1A00;               { function used to set the DTA }
  606.     Registers.DS:=Seg(DTA);            { store the parameter segment in the data egment register DS }
  607.     Registers.DX:=Ofs(DTA);            { stare the parameter offset in the data register DX }
  608.     MSDos(Registers);                  { set DTA location }
  609.     Error:=0;                          { initialize error flag }
  610.     Mask:='????????.???';              { use for search of input data files }
  611.     Mask[9]:=INPUT_FILE_NAME_EXTENSION[1]; { used for looking for input files with a particular file name extension }
  612.     Mask[10]:=INPUT_FILE_NAME_EXTENSION[2];
  613.     Mask[11]:=INPUT_FILE_NAME_EXTENSION[3];
  614.     Mask[12]:=INPUT_FILE_NAME_EXTENSION[4];
  615.     Registers.AX:=$4E00;               { get first directory entry }
  616.     Registers.DS:=Seg(Mask);           { point to the file Mask }
  617.     Registers.DX:=Ofs(Mask);
  618.     Registers.CX:=22;                  { store the option }
  619.     MSDos(Registers);                  { execute MSDos call }
  620.     Error:=Registers.AX and $FF;       { get Error return }
  621.     I:=1;                              { initialize 'I' to the first element }
  622.     If (Error=0) Then
  623.       Repeat
  624.         FileName[I]:=Chr(Mem[Seg(DTA):Ofs(DTA)+29+I]);
  625.         I:=I+1;
  626.       Until Not (FileName[I-1] in [' '..'~']) or (I>20);
  627.     FileName[0] := Chr(I-1);           { set string length because assigning by element does not set length }
  628.     If (Error=0) Then
  629.       Begin                            { remove data file name extension }
  630.         Delete(FileName,Length(FileName)-4,4);
  631.         Write(FileName);
  632.         For J:=Length(FileName)+1 To 10 Do { place spaces between file names so that they line up vertically }
  633.           Write(' ');
  634.       End; { If Error }
  635.     While (Error=0) Do
  636.       Begin
  637.         Error:=0;                      { initialize error flag }
  638.         Registers.AX:=$4F00;           { function used to get the next directory entry }
  639.         Registers.CX:=22;              { set the file option }
  640.         MSDos(Registers);              { call MSDos }
  641.         Error:=Registers.AX and $FF;   { get the Error return }
  642.         I:=1;
  643.         Repeat
  644.           FileName[I]:=Chr(Mem[Seg(DTA):Ofs(DTA)+29+I]);
  645.           I:=I+1;
  646.         Until Not (FileName[I-1] in [' '..'~'] ) or (I > 20);
  647.         FileName[0]:=Chr(I-1);
  648.         If (Error=0) Then
  649.           Begin                        { remove data file name extension }
  650.             Delete(FileName,Length(FileName)-4,4);
  651.             Write(FileName);
  652.             For J:=Length(FileName)+1 To 10 Do { place spaces between file names so that they line up vertically }
  653.               Write(' ');
  654.           End; { If Error }
  655.       End; { While Error }
  656.   End;    { ListDirectory }
  657.  
  658.  
  659.  
  660.   Procedure ShowDirectoryWindow(    ExistantDirectory:Boolean);
  661.  
  662.   { This procedure overlays a directory window to list out input data files on
  663.     top of the current page if the passed ExistantDirectory is true, else it
  664.     displays an error message and removes the incorrectly entered directory
  665.     path. }
  666.  
  667.   Var
  668.     TextString:WorkString;             { string variable used in getting the currently logged directory }
  669.  
  670.   Begin   { ShowDirectoryWindow }
  671.     StoreTextScreen(1);                { take snapshot of the screen }
  672.     If ExistantDirectory Then
  673.       Begin                            { place directory window on top of current page }
  674.         TextColor(InputWindowBorderColor);
  675.         TextBackground(InputWindowColor);
  676.         SoundAttention;
  677.         ZoomWindow2(4,17,77,24);
  678.         TextColor(HighlightColor);
  679.         GetDir(0,TextString);          { get directory label containing input data files }
  680.         WriteCenterText(17,'Directory Listing of '+TextString);
  681.         TextColor(ForegroundColor);
  682.         WriteCenterText(24,'Strike any key to continue');
  683.         Window(12,18,71,23);
  684.         GotoXY(1,1);
  685.         TextColor(HighlightColor);
  686.         ListDirectory;
  687.         Window(1,1,80,25);
  688.       End { If ExistantDirectory }
  689.     Else                               { tell user that directory path specified is non-existent }
  690.       Begin
  691.         TextColor(ForegroundColor);
  692.         TextBackground(BackgroundColor);
  693.         SoundAttention;
  694.         ZoomWindow1(4,5,77,7);
  695.         TextColor(HighlightColor);
  696.         WriteCenterText(6,'The above specified directory path is non-existant');
  697.         TextColor(ForegroundColor);
  698.         WriteCenterText(7,'Strike any key to continue');
  699.  
  700.         { following routine is specific to example application of the input pre-processor }
  701.         G_I_Data[2,1]^:='';            { delete wrongly entered directory path }
  702.  
  703.       End; { Not a existent directory }
  704.   End;    { ShowDirectoryWindow }
  705.  
  706.  
  707.  
  708. Begin   { DirectoryModule }
  709.   ExistantDirectory:=True;             { initialize boolean flag }
  710.   GetDir(0,LoggedDirectory);           { temporarily store the currently logged directory }
  711.   { following routine is specific to the example application of the input pre-processor }
  712.   If G_I_Data[2,1]^<>'' Then           { check if user has specified a directory path }
  713.     Begin
  714.       {$I-}                            { I/O error checking is set to passive state }
  715.       ChDir(G_I_Data[2,1]^);           { attempt to change directories }
  716.       {$I+}                            { I/O error checking is set to active state }
  717.       ExistantDirectory:=(IOresult=0); { If ExistantDirectory=True, then directory exists }
  718.     End; { If G_I_Data }
  719.   ShowDirectoryWindow(ExistantDirectory);
  720.   If Not ExistantDirectory Then
  721.     Write_G_I_Entries;                 { this removes the wrongly entered directory path }
  722.   ChDir(LoggedDirectory);              { change back to the previously logged directory }
  723.   WaitUntilKeypressed;
  724.   RemoveWindow;
  725. End;    { DirectoryModule }